1 Install Packages

## [1] "C:/Users/jonat/OneDrive - University of Southern California/Github/jga"

2 Objective

The goal of this file is to compare the transcriptional profile of our Contractile cell dataset (INTACT) with Humphrey’s (DKD) as well as creating figures accordingly.

3 Load INTACT Dataset (Collected)

Th

population_colors <- c(
  "Pericyte" = "#66C2A5",
  "Efferent VSMC" = "#FC8D62",
  "Afferent VSMC" = "#8DA0CB",
  "Renin Cell" = "#E78AC3",
  "EG Mesangial Cell" = "#A6D854",
  "IG Mesangial Cell" = "#FFD92F"
)

light_population_colors <- c(
  "Pericyte" = "#A8D8C5",       # Lighter Pericyte
  "Efferent VSMC" = "#FDBF96",    # Lighter Efferent VSMC
  "Afferent VSMC" = "#B8C9E1",    # Lighter Afferent VSMC
  "Renin Cell" = "#F2A4D6",       # Lighter Renin Cell
  "EG Mesangial Cell" = "#B9E09B", # Lighter EG Mesangial Cell
  "IG Mesangial Cell" = "#FFEB88"  # Lighter IG Mesangial Cell
)

very_light_population_colors <- c(
  "Pericyte" = "#D4EDE4",       # Very light Pericyte
  "Efferent VSMC" = "#FFE0CC",  # Very light Efferent VSMC
  "Afferent VSMC" = "#DEE5F2",  # Very light Afferent VSMC
  "Renin Cell" = "#F8D3E8",     # Very light Renin Cell
  "EG Mesangial Cell" = "#DDF2C7", # Very light EG Mesangial Cell
  "IG Mesangial Cell" = "#FFF4C2"  # Very light IG Mesangial Cell
)
SO.INTACT <- readRDS(here("Datasets", "renamed", "INTACT_JGA_renamed.rds"))
DimPlot(SO.INTACT, group.by = "class.JGA", cols = population_colors)

4 Load DKD Dataset

SO.DKD <- readRDS(here("Datasets", "renamed", "DKD_JGA_renamed.rds"))


Idents(SO.DKD) <- SO.DKD@meta.data$class.JGA

DimPlot(SO.DKD, group.by = "class.JGA", cols = light_population_colors, reduction = "umap")

5 ForLoop INTACT DEG Lists

markers_result <- list()

clusters <- unique(SO.INTACT$class.JGA)

for (i in clusters) {
  
  # Replace spaces with underscores in cluster names
  clean_name <- gsub(" ", "_", i)
  
  # Find markers for the cluster
  markers <- FindMarkers(SO.INTACT, ident.1 = i, group.by = "class.JGA", min.pct = 0.1, logfc.threshold = 0.25)
  markers <- markers %>%
    rownames_to_column(var = "gene") %>%
    arrange(desc(avg_log2FC))
  
  markers_result[[clean_name]] <- markers
  
  # Create variable name without spaces
  var_name <- paste0(clean_name, ".INTACT.markers") 
  assign(var_name, markers, envir = .GlobalEnv)

}

6 ForLoop DKD DEG Lists

markers_result <- list()

clusters <- unique(SO.DKD$class.JGA)


for (i in clusters) {
  
  clean_name <- gsub(" ", "_", i)
  
  markers <- FindMarkers(SO.DKD, ident.1 = i, group.by = "class.JGA", min.pct = 0.1, logfc.threshold = 0.25)
  markers <- markers %>%
    rownames_to_column(var = "gene") %>%
    arrange(desc(avg_log2FC))
  
  markers_result[[clean_name]] <- markers
  
  var_name <- paste0(clean_name, ".DKD.markers") 
  assign(var_name, markers, envir = .GlobalEnv)

}

7 Name Lists

INTACT_list <- list(`Pericyte.INTACT.markers`, `Renin_Cell.INTACT.markers`, `Efferent_VSMC.INTACT.markers`, `Afferent_VSMC.INTACT.markers`, `IG_Mesangial_Cell.INTACT.markers`, `EG_Mesangial_Cell.INTACT.markers`)


DKD_list <- list(`Pericyte.DKD.markers`, `Renin_Cell.DKD.markers`, `Efferent_VSMC.DKD.markers`, `Afferent_VSMC.DKD.markers`, `IG_Mesangial_Cell.DKD.markers`, `EG_Mesangial_Cell.DKD.markers`)


names(INTACT_list) <- c("Pericyte.INTACT.markers", "Renin Cell.INTACT.markers", "Efferent VSMC.INTACT.markers", "Afferent VSMC.INTACT.markers", "IG_Mesangial_Cell.INTACT.markers", "EG_Mesangial_Cell.INTACT.markers")


names(DKD_list) <- c("Pericyte.DKD.markers", "Renin Cell.DKD.markers", "Efferent VSMC.DKD.markers", "Afferent VSMC.DKD.markers", "IG_Mesangial_Cell.DKD.markers", "EG_Mesangial_Cell.DKD.markers")

8 Scatterplot Forloop + R-squared Table

library(dplyr)
library(ggplot2)
library(ggrepel)
library(broom)

# Initialize table for storing R-squared values and slopes
rsq_table <- data.frame(matrix(ncol = 7, nrow = (length(INTACT_list) * length(DKD_list))))
names(rsq_table) <- c("INTACT", "DKD", "R-squared", "Slope", "Shared_DEGs", "INTACT_UniqueDEGs", "DKD_UniqueDEGs")

# List to store scatterplots
scatterplots <- list()

## START FOR {LOOP} LEVEL 1 ##
for (i in 1:length(INTACT_list)) {
  
  x.markers <- INTACT_list[[i]]
  x.markers_tb <- x.markers %>%
    data.frame() %>%
    as_tibble()
  
  ## START FOR {LOOP} LEVEL 2 ##
  for (j in 1:length(DKD_list)) {
    y.markers <- DKD_list[[j]]
    y.markers_tb <- y.markers %>%
      data.frame() %>%
      as_tibble()
    
    # X-Y DEGs Intersection Table
    xy.comp <- inner_join(x.markers_tb, y.markers_tb, by = "gene")

    # Ensure enough genes exist for regression
    if(nrow(xy.comp) > 1) { 
      
      # Selecting only relevant columns
      xy.comp.R2 <- xy.comp %>%
        dplyr::select(avg_log2FC.x, avg_log2FC.y)
      
      # Correct regression model
      model <- lm(avg_log2FC.y ~ avg_log2FC.x, data = xy.comp.R2)
      
      # Extract slope and correct R² calculation
      slope <- coef(model)["avg_log2FC.x"]
      n_rsq <- summary(model)$r.squared

    } else {
      slope <- NA
      n_rsq <- NA  # Not enough data for a valid regression
    }

    # Calculate DEGs counts
    Shared_DEGs <- nrow(xy.comp)
    INTACT_UniqueDEGs <- nrow(x.markers_tb) - Shared_DEGs
    DKD_UniqueDEGs <- nrow(y.markers_tb) - Shared_DEGs

    # Add to R-squared table
    index <- ((i-1) * length(DKD_list)) + j
    rsq_table[index, 1] = names(INTACT_list)[i]
    rsq_table[index, 2] = names(DKD_list)[j]
    rsq_table[index, 3] = n_rsq
    rsq_table[index, 4] = slope  # Adding the slope to the table
    rsq_table[index, 5] = Shared_DEGs
    rsq_table[index, 6] = INTACT_UniqueDEGs
    rsq_table[index, 7] = DKD_UniqueDEGs

    # Generate Scatterplot for each pair
    p <- ggplot(xy.comp, aes(x = avg_log2FC.x, y = avg_log2FC.y, label = gene)) +
      geom_point(color = "#636EFA", alpha = 0.6, size = 2.5) +  # Blue dots with transparency
      geom_smooth(method = "lm", color = "#1E90FF", linetype = "dashed", se = FALSE) + # Best-fit regression line
      geom_text_repel(size = 4, segment.size = 0.2, segment.color = "grey50") +  # Gene labels
      annotate("text", x = min(xy.comp$avg_log2FC.x) + 0.2, 
               y = max(xy.comp$avg_log2FC.y) - 0.2, 
               label = paste0("R² = ", round(n_rsq, 3), "\nSlope = ", round(slope, 3)), 
               color = "black", size = 6, hjust = 0) +
      labs(
        title = paste(names(INTACT_list)[i], "vs", names(DKD_list)[j]),
        x = paste("avg_log2FC -", names(INTACT_list)[i]),
        y = paste("avg_log2FC -", names(DKD_list)[j])
      ) +
      theme_minimal(base_size = 14) +
      theme(
        plot.title = element_text(hjust = 0.5, face = "bold"),
        axis.title = element_text(face = "bold"),
        axis.line = element_line(color = "black", size = 1),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank()
      )

    # Store the plot
    scatterplots[[paste(names(INTACT_list)[i], names(DKD_list)[j], sep = "_vs_")]] <- p
  }
}

# Sort and print the R-squared table
rsq_table <- rsq_table %>%
  arrange(desc(`R-squared`))

print(rsq_table)
##                              INTACT                           DKD   R-squared
## 1  EG_Mesangial_Cell.INTACT.markers EG_Mesangial_Cell.DKD.markers 0.862647841
## 2      Afferent VSMC.INTACT.markers     Afferent VSMC.DKD.markers 0.831247531
## 3           Pericyte.INTACT.markers          Pericyte.DKD.markers 0.819457192
## 4         Renin Cell.INTACT.markers        Renin Cell.DKD.markers 0.803010100
## 5  IG_Mesangial_Cell.INTACT.markers IG_Mesangial_Cell.DKD.markers 0.790403442
## 6      Efferent VSMC.INTACT.markers     Efferent VSMC.DKD.markers 0.740385139
## 7  EG_Mesangial_Cell.INTACT.markers     Efferent VSMC.DKD.markers 0.668994890
## 8         Renin Cell.INTACT.markers          Pericyte.DKD.markers 0.572277895
## 9  IG_Mesangial_Cell.INTACT.markers EG_Mesangial_Cell.DKD.markers 0.537229255
## 10 IG_Mesangial_Cell.INTACT.markers     Efferent VSMC.DKD.markers 0.504824403
## 11     Efferent VSMC.INTACT.markers     Afferent VSMC.DKD.markers 0.480773225
## 12 EG_Mesangial_Cell.INTACT.markers IG_Mesangial_Cell.DKD.markers 0.457437589
## 13 EG_Mesangial_Cell.INTACT.markers          Pericyte.DKD.markers 0.426273266
## 14     Afferent VSMC.INTACT.markers          Pericyte.DKD.markers 0.387702919
## 15 EG_Mesangial_Cell.INTACT.markers     Afferent VSMC.DKD.markers 0.352703716
## 16 IG_Mesangial_Cell.INTACT.markers          Pericyte.DKD.markers 0.288119271
## 17          Pericyte.INTACT.markers     Afferent VSMC.DKD.markers 0.260040018
## 18     Efferent VSMC.INTACT.markers EG_Mesangial_Cell.DKD.markers 0.259354907
## 19          Pericyte.INTACT.markers        Renin Cell.DKD.markers 0.245749286
## 20     Efferent VSMC.INTACT.markers IG_Mesangial_Cell.DKD.markers 0.238030300
## 21     Afferent VSMC.INTACT.markers     Efferent VSMC.DKD.markers 0.228765923
## 22 IG_Mesangial_Cell.INTACT.markers     Afferent VSMC.DKD.markers 0.224417055
## 23     Afferent VSMC.INTACT.markers IG_Mesangial_Cell.DKD.markers 0.139533018
## 24 IG_Mesangial_Cell.INTACT.markers        Renin Cell.DKD.markers 0.132890962
## 25     Afferent VSMC.INTACT.markers        Renin Cell.DKD.markers 0.125052174
## 26     Afferent VSMC.INTACT.markers EG_Mesangial_Cell.DKD.markers 0.113107091
## 27     Efferent VSMC.INTACT.markers        Renin Cell.DKD.markers 0.108523435
## 28        Renin Cell.INTACT.markers EG_Mesangial_Cell.DKD.markers 0.099814663
## 29          Pericyte.INTACT.markers EG_Mesangial_Cell.DKD.markers 0.052345211
## 30 EG_Mesangial_Cell.INTACT.markers        Renin Cell.DKD.markers 0.046251195
## 31        Renin Cell.INTACT.markers     Efferent VSMC.DKD.markers 0.043587162
## 32     Efferent VSMC.INTACT.markers          Pericyte.DKD.markers 0.037838104
## 33        Renin Cell.INTACT.markers     Afferent VSMC.DKD.markers 0.032801618
## 34        Renin Cell.INTACT.markers IG_Mesangial_Cell.DKD.markers 0.019154722
## 35          Pericyte.INTACT.markers IG_Mesangial_Cell.DKD.markers 0.010812252
## 36          Pericyte.INTACT.markers     Efferent VSMC.DKD.markers 0.001762716
##          Slope Shared_DEGs INTACT_UniqueDEGs DKD_UniqueDEGs
## 1   0.63940271         205               361             41
## 2   0.70588884         288               340             72
## 3   0.71307954         202               277             52
## 4   0.61774415         121               297             46
## 5   0.63103536         271               406             66
## 6   0.97918306         157               165            110
## 7  -0.55003709         196               370             71
## 8  -0.63666837         163               255             91
## 9   0.49583190         172               505             74
## 10 -0.45789929         192               485             75
## 11  0.94078811         151               171            209
## 12  0.50552533         199               367            138
## 13 -0.43613374         178               388             76
## 14 -0.43452605         182               446             72
## 15 -0.45170043         205               361            155
## 16 -0.35489091         174               503             80
## 17 -0.48657973         224               255            136
## 18 -0.59620799         122               200            124
## 19 -0.36347404         104               375             63
## 20 -0.58180205         132               190            205
## 21  0.35786872         166               462            101
## 22 -0.34887895         225               452            135
## 23 -0.29089127         185               443            152
## 24 -0.21074614         114               563             53
## 25  0.23297370         114               514             53
## 26 -0.23599981         163               465             83
## 27  0.38895520          84               238             83
## 28  0.27028492         115               303            131
## 29 -0.19768459         151               328             95
## 30 -0.13374036         112               454             55
## 31 -0.17619234         127               291            140
## 32 -0.22231555         136               186            118
## 33  0.16194158         152               266            208
## 34 -0.12952710         138               280            199
## 35 -0.10286346         167               312            170
## 36  0.03709079         152               327            115
# Display all scatterplots
for (plot_name in names(scatterplots)) {
  print(scatterplots[[plot_name]])
}

9 Create HeatMap of Datasets

df <- rsq_table %>%
                dplyr::select(INTACT, DKD, "R-squared") %>%
                mutate(INTACT = sub("_Named_", " ", INTACT)) %>%
                mutate(DKD = sub("_Named_", " ", DKD)) %>%
                pivot_wider(names_from = DKD, values_from = "R-squared") %>%
                column_to_rownames(var = "INTACT") %>%
                as.matrix()


library(corrplot)
## Correlation Plot
corrplot(df, method = 'color')

DimPlot(SO.INTACT, group.by = "class.JGA")

10 Specific Marker Expression

11 Figures

11.1 First Panel

p1 <- DimPlot(SO.DKD, reduction = "umap", cols = very_light_population_colors)  + 
  ylab("UMAP 2") +
  xlab("UMAP 1") +
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 20),
    axis.line = element_line(size = 1, colour = "black"),
    axis.text = element_blank(),          # Remove axis text
    axis.ticks = element_blank(),         # Optional: Remove axis ticks
    text = element_text(size = 20)
  ) + ggtitle("UMAP - DKD Contractile Clusters") 


p2 <- DimPlot(SO.INTACT, reduction = "umap", group.by = "class.JGA", cols = population_colors) + 
  ylab("UMAP 2") +
  xlab("UMAP 1") +
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 20),
    axis.line = element_line(size = 1, colour = "black"),
    axis.text = element_blank(),          # Remove axis text
    axis.ticks = element_blank(),         # Optional: Remove axis ticks
    text = element_text(size = 20)
  ) + ggtitle("UMAP - INTACT Contractile Clusters") 

print(p1)

print(p2)

11.2 Panel 2

library(patchwork)

library(ggplot2)
library(patchwork)

Idents(SO.DKD) <- SO.DKD@meta.data$class.JGA
Idents(SO.INTACT) <- SO.INTACT@meta.data$class.JGA

Idents(SO.DKD) <- SO.DKD@meta.data$class.JGA
Idents(SO.INTACT) <- SO.INTACT@meta.data$class.JGA


markers.to.plot <- c("Nkain2", 
                     "Col23a1", # Adora1 didn't look good 
                     "Ren1", 
                     "Hpse2", 
                     "Tenm2", 
                     "Tshz2")



#cluster_order <- c("Pericyte", "Efferent VSMC", "Afferent VSMC", "Renin Cell", "EG Mesangial Cell", "IG Mesangial Cell")

#SO.DKD@meta.data$class.JGA <- factor(SO.DKD@meta.data$class.JGA, levels = cluster_order)


p3 <- DotPlot(SO.DKD, features = markers.to.plot) +
  coord_flip() +
  ggtitle("Gene Expression Across Clusters - DKD") + 
  xlab("Clusters") + ylab("Marker Genes") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(size = 14, face = "bold", hjust = 0.5))

p4 <- DotPlot(SO.INTACT, features = markers.to.plot) +
  coord_flip() +
  ggtitle("Gene Expression Across Clusters - INTACT") + 
  xlab("Clusters") + ylab("Marker Genes") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(size = 14, face = "bold", hjust = 0.5))

p3

p4

11.3 Panel 3

xy.comp <- inner_join(IG_Mesangial_Cell.INTACT.markers, IG_Mesangial_Cell.DKD.markers, by = "gene")

df.upper <- subset(xy.comp, avg_log2FC.x > 1 & avg_log2FC.y > 1)
df.lower <- subset(xy.comp, avg_log2FC.x < -1 & avg_log2FC.y < -1)

model <- lm(avg_log2FC.y ~ avg_log2FC.x, data = xy.comp)

slope <- coef(model)["avg_log2FC.x"]
r_squared <- summary(model)$r.squared



library(ggplot2)
library(ggrepel)

xy.comp <- inner_join(IG_Mesangial_Cell.INTACT.markers, IG_Mesangial_Cell.DKD.markers, by = "gene")

p5 <- ggplot(xy.comp, aes(x = avg_log2FC.x, y = avg_log2FC.y, label = gene)) +
  
  geom_point(color = "#636EFA", alpha = 0.6, size = 2.5) + 
  
  geom_point(data = df.upper, color = "#EF553B", size = 3.5) + 
  geom_point(data = df.lower, color = "#00CC96", size = 3.5) + 
  geom_smooth(method = "lm", color = "#1E90FF", linetype = "dashed", se = FALSE) +
  
  geom_text_repel(data = rbind(df.upper, df.lower), segment.size = 0.2, segment.color = "grey50", 
                  size = 5) +
    annotate("text", x = min(xy.comp$avg_log2FC.x) + 0.2, 
           y = max(xy.comp$avg_log2FC.y) - 0.2, 
           label = paste0("R² = ", round(r_squared, 3), "\nSlope = ", round(slope, 3)), 
           color = "black", size = 6, hjust = 0) +

  
  labs(
    title = "Intraglomerular Mesangial Gene Expression: INTACT vs DKD",
    x = "Average log2FC - INTACT IG Mesangial",
    y = "Average log2FC - DKD IG Mesangial"
  ) +
  
  theme_minimal(base_size = 16) + 
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.title = element_text(face = "bold"), 
    axis.line = element_line(color = "black", size = 1),  
    panel.grid.major = element_blank(),  
    panel.grid.minor = element_blank()  
  )


p5

11.4 Panel 4

library(dplyr)
library(tidyr)
library(ggplot2)
library(reshape2)
library(RColorBrewer)

rsq_table <- rsq_table %>%
  mutate(
    INTACT = gsub("\\.", " ", INTACT),
    DKD = gsub("\\.", " ", DKD),
    INTACT = gsub("INTACT markers", "", INTACT), 
    DKD = gsub("DKD markers", "", DKD),
    INTACT = gsub("_", " ", INTACT),
    DKD = gsub("_", " ", DKD)
  )

df <- rsq_table %>%
  dplyr::select(INTACT, DKD, `R-squared`) %>%
  pivot_wider(names_from = DKD, values_from = `R-squared`) %>%
  column_to_rownames(var = "INTACT") %>%
  as.matrix()

cor_long <- melt(df)

p6 <- ggplot(cor_long, aes(x = Var1, y = Var2, fill = value)) +
  
  geom_tile(color = "white", size = 0.3) +
  
  geom_text(aes(label = sprintf("%.2f", value)), size = 5, fontface = "bold",
            color = ifelse(cor_long$value > 0.5, "white", "black")) + 
  
  scale_fill_gradientn(colors = rev(brewer.pal(9, "RdBu")), 
                       limits = c(0, 1), name = "R²") +
  
  theme_minimal(base_size = 16) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 14, face = "bold", color = "black"),
    axis.text.y = element_text(size = 14, face = "bold", color = "black"),
    axis.title = element_text(size = 16, face = "bold"),
    panel.grid = element_blank(),  # No distracting grid lines
    legend.position = "right",
    legend.title = element_text(size = 14, face = "bold"),
    legend.text = element_text(size = 12),
    plot.title = element_text(size = 20, face = "bold", hjust = 0.5)
  ) +
  
  labs(title = "Correlation of Contractile Cell Clusters (INTACT vs DKD)",
       x = "DKD Clusters",
       y = "INTACT Clusters")

p6

## JWN Coding

# Define the desired order
cor_long$Var1 <- trimws(cor_long$Var1)
cor_long$Var2 <- trimws(cor_long$Var2)

# Convert Var1 and Var2 into ordered factors
cor_long$Var1 <- factor(cor_long$Var1, levels = c("Pericyte", "Efferent VSMC", "Afferent VSMC", 
                                                  "Renin Cell", "EG Mesangial Cell", "IG Mesangial Cell"))
cor_long$Var2 <- factor(cor_long$Var2, levels = c("Pericyte", "Efferent VSMC", "Afferent VSMC", 
                                                  "Renin Cell", "EG Mesangial Cell", "IG Mesangial Cell"))

# Plot
p6 <- ggplot(cor_long, aes(x = Var2, y = Var1, fill = value)) + 
  geom_tile(color = "white", size = 0.3) + 
  geom_text(aes(label = sprintf("%.2f", value)), size = 5, fontface = "bold",
            color = ifelse(cor_long$value > 0.5, "white", "black")) + 
  scale_fill_gradientn(colors = rev(brewer.pal(9, "RdBu")), 
                       limits = c(0, 1), name = "R²") +
  theme_minimal(base_size = 16) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 14, face = "bold", color = "black"),
    axis.text.y = element_text(size = 14, face = "bold", color = "black"),
    axis.title = element_text(size = 16, face = "bold"),
    panel.grid = element_blank(),
    legend.position = "right",
    legend.title = element_text(size = 14, face = "bold"),
    legend.text = element_text(size = 12),
    plot.title = element_text(size = 20, face = "bold", hjust = 0.5)
  ) +
  labs(title = "Correlation between INTACT vs DKD",
       x = "DKD Clusters",
       y = "INTACT Clusters") +
  coord_fixed(ratio = .5)

p6

12 Final Figure

p1

p2

p3

p4

p5

p6

13 Session Info

sessionInfo()
## R version 4.4.3 (2025-02-28 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 22631)
## 
## Matrix products: default
## 
## 
## locale:
## [1] LC_COLLATE=English_United States.utf8 
## [2] LC_CTYPE=English_United States.utf8   
## [3] LC_MONETARY=English_United States.utf8
## [4] LC_NUMERIC=C                          
## [5] LC_TIME=English_United States.utf8    
## 
## time zone: America/Los_Angeles
## tzcode source: internal
## 
## attached base packages:
## [1] grid      stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] RColorBrewer_1.1-3  reshape2_1.4.4      corrplot_0.95      
##  [4] broom_1.0.7         ggrepel_0.9.6       ggvenn_0.1.10      
##  [7] gplots_3.2.0        gridExtra_2.3       sjmisc_2.8.10      
## [10] openxlsx_4.2.8      lubridate_1.9.4     forcats_1.0.0      
## [13] stringr_1.5.1       purrr_1.0.4         readr_2.1.5        
## [16] tidyr_1.3.1         tibble_3.2.1        tidyverse_2.0.0    
## [19] devtools_2.4.5      usethis_3.1.0       here_1.0.1         
## [22] ggpmisc_0.6.1       ggpp_0.5.8-1        BiocManager_1.30.25
## [25] ggplot2_3.5.1       knitr_1.50          patchwork_1.3.0    
## [28] SeuratObject_5.0.2  Seurat_4.4.0        dplyr_1.1.4        
## 
## loaded via a namespace (and not attached):
##   [1] RcppAnnoy_0.0.22       splines_4.4.3          later_1.4.1           
##   [4] bitops_1.0-9           polyclip_1.10-7        lifecycle_1.0.4       
##   [7] rprojroot_2.0.4        globals_0.16.3         lattice_0.22-6        
##  [10] MASS_7.3-64            insight_1.1.0          backports_1.5.0       
##  [13] magrittr_2.0.3         plotly_4.10.4          sass_0.4.9            
##  [16] rmarkdown_2.29         jquerylib_0.1.4        yaml_2.3.10           
##  [19] remotes_2.5.0          httpuv_1.6.15          sctransform_0.4.1     
##  [22] spam_2.11-1            zip_2.3.2              sp_2.2-0              
##  [25] sessioninfo_1.2.3      pkgbuild_1.4.6         spatstat.sparse_3.1-0 
##  [28] reticulate_1.41.0.1    cowplot_1.1.3          pbapply_1.7-2         
##  [31] abind_1.4-8            pkgload_1.4.0          Rtsne_0.17            
##  [34] irlba_2.3.5.1          listenv_0.9.1          spatstat.utils_3.1-3  
##  [37] MatrixModels_0.5-3     goftest_1.2-3          spatstat.random_3.3-2 
##  [40] fitdistrplus_1.2-2     parallelly_1.42.0      leiden_0.4.3.1        
##  [43] codetools_0.2-20       tidyselect_1.2.1       farver_2.1.2          
##  [46] matrixStats_1.5.0      spatstat.explore_3.3-4 jsonlite_1.9.1        
##  [49] ellipsis_0.3.2         progressr_0.15.1       ggridges_0.5.6        
##  [52] survival_3.8-3         tools_4.4.3            ica_1.0-3             
##  [55] Rcpp_1.0.14            glue_1.8.0             xfun_0.51             
##  [58] mgcv_1.9-1             withr_3.0.2            fastmap_1.2.0         
##  [61] SparseM_1.84-2         caTools_1.18.3         digest_0.6.37         
##  [64] timechange_0.3.0       R6_2.6.1               mime_0.12             
##  [67] colorspace_2.1-1       scattermore_1.2        gtools_3.9.5          
##  [70] tensor_1.5             spatstat.data_3.1-6    generics_0.1.3        
##  [73] data.table_1.17.0      httr_1.4.7             htmlwidgets_1.6.4     
##  [76] uwot_0.2.3             pkgconfig_2.0.3        gtable_0.3.6          
##  [79] lmtest_0.9-40          htmltools_0.5.8.1      profvis_0.4.0         
##  [82] dotCall64_1.2          scales_1.3.0           png_0.1-8             
##  [85] spatstat.univar_3.1-2  rstudioapi_0.17.1      tzdb_0.5.0            
##  [88] nlme_3.1-167           cachem_1.1.0           zoo_1.8-13            
##  [91] sjlabelled_1.2.0       KernSmooth_2.23-26     parallel_4.4.3        
##  [94] miniUI_0.1.1.1         pillar_1.10.1          vctrs_0.6.5           
##  [97] RANN_2.6.2             urlchecker_1.0.1       promises_1.3.2        
## [100] xtable_1.8-4           cluster_2.1.8          evaluate_1.0.3        
## [103] cli_3.6.4              compiler_4.4.3         rlang_1.1.5           
## [106] future.apply_1.11.3    labeling_0.4.3         plyr_1.8.9            
## [109] fs_1.6.5               stringi_1.8.4          viridisLite_0.4.2     
## [112] deldir_2.0-4           munsell_0.5.1          lazyeval_0.2.2        
## [115] spatstat.geom_3.3-5    quantreg_6.1           Matrix_1.7-2          
## [118] hms_1.1.3              future_1.34.0          shiny_1.10.0          
## [121] ROCR_1.0-11            igraph_2.1.4           memoise_2.0.1         
## [124] bslib_0.9.0            polynom_1.4-1